home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Workbench / BackClock / sources / tracewin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-11-09  |  6.7 KB  |  202 lines

  1. /*****************************************************************************
  2.  *
  3.  * Nom:                         tracewin.c
  4.  * Desc:                        fonctions de traçage dans les fenetres
  5.  *
  6.  *
  7.  * version                      : $VER: tracewin.c 2.3ß5 (16.08.98)
  8.  *
  9.  * ver2.3: fill background or transparent
  10.  * ver2.3ß3: CyberGraphics support (beta)
  11.  * ver2.3ß4: BugFixed but beta CGX
  12.  * ver2.3ß5: Filled needles(option), no direct CGX support (deleted)
  13.  *****************************************************************************
  14.  */ 
  15. #include <exec/memory.h>
  16. #include <graphics/rastport.h>
  17. #include <proto/graphics.h>
  18. #include <proto/exec.h>
  19. #include <math.h>
  20. #include "utils.h"
  21. #include "tracewin.h"
  22. #include <graphics/gfxmacros.h>
  23.  
  24.  
  25. /*UWORD area_pat[] = {
  26.   0xf0f0,0xf0f0,0xf0f0, 0xf0f0, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f
  27. } ;*/
  28.  
  29. PLANEPTR tmpbitmap ;
  30. USHORT Xplane, Yplane ;
  31.  
  32. struct pt ptSec,
  33.           ptMin,
  34.           ptHeu ;
  35. ULONG mX, mY ;
  36.  
  37. void initwin(idWin * prj) {
  38.   int i ;
  39.   
  40.   mX = prj->backWin.width / 2 ;
  41.   mY = prj->backWin.height / 2 ;
  42.   if (prj->RP1) {
  43.     if(prj->backWin.fill) {
  44.       SetAPen(prj->RP1, prj->backWin.cmap[COL_BAC].reg) ;
  45.       RectFill(prj->RP1, 0, 0, prj->backWin.width-1, prj->backWin.height-1) ;
  46.     }
  47.     SetAPen(prj->RP1, prj->backWin.cmap[COL_TIC].reg) ;                                                       // couleur jaune
  48.     for(i = 0; i < 360; i+=30) {
  49.       /* trace les repères des heures
  50.       */
  51.       Move(prj->RP1, ULONG(cos(PI*i/180.0) * (mX-mX/10L)) + mX, ULONG(sin(PI*i/180.0) * (mY-mY/10L)) + mY) ;
  52.       Draw(prj->RP1, ULONG(cos(PI*i/180.0) * mX) + mX, ULONG(sin(PI*i/180.0) * mY) + mY) ;
  53.     }
  54.     
  55.   }
  56.   /* initalisation des points des aiguilles
  57.    */
  58.   /* secondes
  59.    */
  60.   ptSec.points = 2 ;
  61.   ptSec.fill   = FALSE ;
  62.   ptSec.pt_buffer = NULL ; // idem
  63.   ptSec.A[0]   = 0 ;
  64.   ptSec.A[1]   = 180 ;
  65.   ptSec.M[0]   = 5.0 ;
  66.   ptSec.M[1]   = 1.2 ;
  67.   ptSec.angle  = ANGLE_S ;
  68.   /* heures
  69.    */
  70.   ptHeu.points = 5 ;
  71.   ptHeu.fill   = TRUE ;
  72.   ptHeu.pt_buffer = AllocVec(10 * ptHeu.points, MEMF_PUBLIC) ;
  73.   ptHeu.A[0]   = 0 ;
  74.   ptHeu.A[1]   = 100 ;
  75.   ptHeu.A[2]   = 180 ;
  76.   ptHeu.A[3]   = -100 ;
  77.   ptHeu.A[4]   = 0 ;
  78.   ptHeu.M[0]   = 3.0 ;
  79.   ptHeu.M[1]   = 1.1 ;
  80.   ptHeu.M[2]   = 1.2 ;
  81.   ptHeu.M[3]   = 1.1 ;
  82.   ptHeu.M[4]   = 3.0 ;
  83.   ptHeu.angle  = ANGLE_H ;
  84.   
  85.   /* minutes
  86.    */
  87.   ptMin.points =   5 ;
  88.   ptMin.fill   = TRUE ;
  89.   ptMin.pt_buffer = AllocVec(10 * ptMin.points, MEMF_PUBLIC) ;
  90.   ptMin.A[0]   =   0 ;
  91.   ptMin.A[1]   =  150 ;
  92.   ptMin.A[2]   = 180 ;
  93.   ptMin.A[3]   = -150 ;
  94.   ptMin.A[4]   =   0 ;
  95.   ptMin.M[0]   =   4 ;
  96.   ptMin.M[1]   =   1.3 ;
  97.   ptMin.M[2]   =   1.2 ;
  98.   ptMin.M[3]   =   1.3 ;
  99.   ptMin.M[4]   =   4 ;
  100.   ptMin.angle  = ANGLE_M ;
  101.   
  102.   prj->ai     = AllocVec(sizeof(struct AreaInfo), MEMF_PUBLIC|MEMF_CLEAR) ;
  103.  
  104.   //SetAfPt(prj->RP2, area_pat, 3) ;
  105.   effacer(prj) ;
  106.   retracer(prj) ;
  107.  
  108. }
  109. void free_twin(idWin * prj) {
  110.   /* free vertice buffer
  111.    * areainfo and tmpras buffer
  112.    */
  113.   if (ptSec.pt_buffer) FreeVec(ptSec.pt_buffer) ;
  114.   if (ptMin.pt_buffer) FreeVec(ptMin.pt_buffer) ;
  115.   if (ptHeu.pt_buffer) FreeVec(ptHeu.pt_buffer) ;
  116.   if (prj->ai)         FreeVec(prj->ai) ;
  117. }
  118.  
  119. void reinit_win(idWin * prj) {
  120.   free_twin(prj) ;
  121.   initwin(prj) ;
  122. }
  123.  
  124. void effacer(idWin * prj) {
  125. //  BltBitMapRastPort(prj->wb->RastPort.BitMap, prj->backWin.posX, prj->backWin.posY, prj->RP1, 0, 0, prj->backWin.width, prj->backWin.height, 0xc0) ;
  126.   WaitBlit() ;
  127.   BltBitMapRastPort(prj->RP1->BitMap, 0,0, prj->RP2, 0, 0, prj->backWin.width, prj->backWin.height, 0xc0) ;
  128. }
  129. void retracer(idWin * prj) {
  130.   SetAPen(prj->RP2, prj->backWin.cmap[COL_HEU].reg) ;
  131.   tracerAiguilles(prj, &ptHeu, prj->heu, prj->min/2) ;
  132.   SetAPen(prj->RP2, prj->backWin.cmap[COL_MIN].reg) ;
  133.   tracerAiguilles(prj, &ptMin, prj->min, NULL) ;
  134.   if (prj->backWin.drawsec) {
  135.     SetAPen(prj->RP2, prj->backWin.cmap[COL_SEC].reg) ;
  136.     tracerAiguilles(prj, &ptSec, prj->sec, NULL) ;
  137.   }
  138.   WaitBlit() ;
  139.   BltBitMapRastPort(prj->RP2->BitMap, 0,0, prj->win->RPort, 0, 0, prj->backWin.width, prj->backWin.height, 0xc0) ;
  140.  
  141. }
  142. void tracerAiguilles(idWin * prj, struct pt * ptAigu, UBYTE p_time, UBYTE an_inc) {
  143.   int i ;
  144.   
  145.   Move(prj->RP2, mX+(ULONG)(cos(PI*(ptAigu->A[0]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mX-mX/ptAigu->M[0])), 
  146.                         mY+(ULONG)(sin(PI*(ptAigu->A[0]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mY-mY/ptAigu->M[0]))) ;
  147.  
  148.   if (!ptAigu->fill || (prj->backWin.filln == 0)) {
  149.     // tracer sans remplissage
  150.     // no fill
  151.     for(i = 0; i<ptAigu->points; i++)
  152.       Draw(prj->RP2, mX+(ULONG)(cos(PI*(ptAigu->A[i]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mX-mX/ptAigu->M[i])), 
  153.                             mY+(ULONG)(sin(PI*(ptAigu->A[i]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mY-mY/ptAigu->M[i]))) ;
  154.   }else {
  155.     // avec remplissage
  156.     // fill
  157.     prj->RP2->AreaInfo = prj->ai ;
  158.     InitArea(prj->ai, ptAigu->pt_buffer, ptAigu->points+2) ;
  159.     
  160.     AreaMove(prj->RP2, (SHORT)mX+(ULONG)(cos(PI*(ptAigu->A[0]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mX-mX/ptAigu->M[0])), 
  161.                               (SHORT)mY+(ULONG)(sin(PI*(ptAigu->A[0]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mY-mY/ptAigu->M[0]))) ;
  162.  
  163.     for(i = 0; i < ptAigu->points; i++) 
  164.       AreaDraw(prj->RP2, (SHORT)mX+(ULONG)(cos(PI*(ptAigu->A[i]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mX-mX/ptAigu->M[i])), 
  165.                                 (SHORT)mY+(ULONG)(sin(PI*(ptAigu->A[i]+p_time*ptAigu->angle+an_inc-90.0)/180.0)*(mY-mY/ptAigu->M[i]))) ;
  166.       
  167.     AreaEnd(prj->RP2) ;
  168.   }
  169. }
  170.  
  171. void init_bitmap(idWin * prj) {
  172.   /* initialize tmp rastport and bitmap
  173.    */
  174.   prj->tmpras = AllocVec(sizeof(struct TmpRas), MEMF_PUBLIC|MEMF_CLEAR) ;
  175.   prj->RP1 = AllocVec(sizeof(struct RastPort), MEMF_PUBLIC) ;
  176.   prj->RP2 = AllocVec(sizeof(struct RastPort), MEMF_PUBLIC) ; 
  177.   InitRastPort(prj->RP1) ;
  178.   InitRastPort(prj->RP2) ;
  179.   Xplane = prj->backWin.width ;
  180.   Yplane = prj->backWin.height ; 
  181.   prj->RP1->BitMap = AllocBitMap(Xplane, Yplane, prj->wb->RastPort.BitMap->Depth, BMF_CLEAR|BMF_DISPLAYABLE, NULL) ;
  182.   prj->RP2->BitMap = AllocBitMap(Xplane, Yplane, prj->wb->RastPort.BitMap->Depth, BMF_CLEAR|BMF_DISPLAYABLE, NULL) ;
  183.   tmpbitmap        = AllocRaster(Xplane, Yplane) ;
  184.   prj->RP2->TmpRas = (struct TmpRas *) InitTmpRas(prj->tmpras, tmpbitmap, RASSIZE(Xplane, Yplane)) ;
  185.   WaitBlit() ;
  186.   BltBitMapRastPort(prj->wb->RastPort.BitMap, prj->backWin.posX, prj->backWin.posY, prj->RP1, 0, 0, prj->backWin.width, prj->backWin.height, 0xc0) ;
  187.  
  188.  
  189. }
  190.  
  191. void free_bitmap(idWin * prj) {
  192.   if (prj->tmpras) FreeVec(prj->tmpras) ;
  193.   if (tmpbitmap) FreeRaster(tmpbitmap, Xplane, Yplane) ;
  194.   if (prj->RP1 && prj->RP1->BitMap) FreeBitMap(prj->RP1->BitMap) ;
  195.   if (prj->RP2 && prj->RP2->BitMap) FreeBitMap(prj->RP2->BitMap) ;
  196.   if (prj->RP1) FreeVec(prj->RP1) ;
  197.   if (prj->RP2) FreeVec(prj->RP2) ;
  198.   prj->RP1 = prj->RP2 = NULL ;
  199.   
  200. }
  201.  
  202.